/*
 * Copyright:  2018 smarabbit studio.
 *
 * Licensed under the Confluent Community License; you may not use this file except in
 * compliance with the License.  You may obtain a copy of the License at
 *
 * http://www.confluent.io/confluent-community-license
 *
 *  Unless required by applicable law or agreed to in writing, software distributed under
 *  the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 *  either express or implied.  See the License for the specific language governing
 *  permissions and limitations under the License.
 *
 *  @作   者： 黄开晖 (117227773@qq.com)
 *  @日   期:    2020/7/7 下午9:13
 *
 */

package com.massyframework.beanskin.runtime.modular.assembly.handling;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Objects;

import com.massyframework.beanskin.assembly.AssemblyContext;

/**
 * {@link ServiceInvocationHandler}, 服务代理基类
 */
class ServiceInvocationHandler implements InvocationHandler {

    private String name;
    private AssemblyContext context;
    private volatile Object servcie;

    public ServiceInvocationHandler(String name, AssemblyContext context){
        this.name = Objects.requireNonNull(name, "\"name\" cannot be null.");
        this.context = Objects.requireNonNull(context, "\"context\" cannot be null.");
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(getService(), args);
    }

    /**
     * 服务
     * @return {@link Object}
     */
    public Object getService(){
        if (this.servcie == null){
            synchronized (this){
                this.servcie = context.getBean(name);
            }
        }
        return this.servcie;
    }
}
